// 学习使用 不定参宏函数 和 不定参函数

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define LOG(fmt, ...) printf("[%s:%d]" fmt, __FILE__, __LINE__, ##__VA_ARGS__);

void printLOG()
{
    // 打印日志信息
    // printf("[%s:%d] %s-%d\n", __FILE__, __LINE__, "日志系统第一课", 1);
    // LOG("%s-%d\n", "日志系统第一课", 1);
    LOG("日志系统第一课\n");
}

//根据传入的数量，打印 int 值
void printNum(int count, ...)
{
    va_list ap; //指向不定参数的指针
    va_start(ap, count);    //不定参数指针的起点

    for(int i = 0; i < count; i++)
    {
        int num = va_arg(ap, int);  //每次提取一个 int 类型的参数
        printf("param[%d]:%d\n", i, num);
    }

    va_end(ap); //销毁不定参数指针
}

//设计自己的 printf
void myPrintf(const char *fmt, ...)
{
    //从 fmt 中提取信息
    va_list ap;
    va_start(ap, fmt);

    char* res;  //解析成功后的字符串
    int ret = vasprintf(&res, fmt, ap);
    if(ret != -1)
    {
        printf(res);
        free(res);
    }

    va_end(ap);
}

int main()
{
    // printLOG();
    // printNum(2, 668, 668);
    // printNum(5, 5, 4, 3, 2, 1);

    myPrintf("%s %d\n", "hello printf", 666);
    return 0;
}